package com.kang.c0c.symbol;

import java.util.Vector;

import com.kang.c0c.parser.Token;

/**
 * 类FunctionSymbol是类Symbol的扩展，用来定义更多用户自定义函数的符号表信息
 * 扩展的属性为
 * @field
 * type			：用户自定义函数的返回值类型INT或者VOID
 * 				 另外，类FunctionSymbol对外提供了两个用来判断符号表项所定义的函数的返回值类型
 * 					isInt			：判断sym的函数返回值类型是否为int
 * 					isVoid			：判断sym的函数返回值类型是否为void
 * paramCount	：函数参数的个数统计
 * paramList	：函数参数列表
 * nameTable	：函数内部的局部符号表
 * 
 * 注：在对nameTable操作后需要更新varCount的信息
 * 
 * @author kang
 *
 * Feb 7, 2009
 */
public class FunctionSymbol extends Symbol implements Type{
	private int type;
	private int paramCount;
	private Vector<Symbol> paramList;
	
	public FunctionSymbol(NameTable father, int pos, String name, int type) {
		super(pos, name, Kinds.FUNC);
		this.type = type;
		paramCount = 0;
		nameTable = new NameTable(father);
		paramList = new Vector<Symbol>();
	}

	public static boolean isVoid(FunctionSymbol sym) {
		return sym.type==VOID;
	}

	public static boolean isInt(FunctionSymbol sym){
		return sym.type==INT;
	}
	
	public int getParamCount() {
		return paramCount;
	}
	
	public Symbol getParamAt(int i){
		return paramList.elementAt(i);
	}
	
	public void appendParam(Symbol sym){
		paramList.add(sym);
		paramCount ++;
	}
	
	public Symbol appendParam(Token token){
		Symbol sym = new Symbol(token.getPos(),(String)token.getValue(),Kinds.PARAM);
		this.appendParam(sym);
		
		return sym;
	}
	
	/*
	 * 获取函数局部变量的个数，在生成目标代码分配数据存储空间时需要用到
	 */
	public int getVarCount(){
		return nameTable.getVarCount();
	}
	
	public NameTable nameTable;
}